/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package solucionessgh.Util;


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author roderick
 */
public class Paginando {

     protected static String dbClass = "org.postgresql.Driver";

// Cadena de conexión
        protected static String dbUrl = "jdbc:postgresql://localhost/sgh";

// Método que crea una conexión a nuestra Base de datos

protected Connection getConnection() {
        /*Properties props = new Properties();
        props.put("user","tu_usuario");
        props.put("password","tu_clave");  */
        Connection conBBDD = null;
        try {
            Class.forName(dbClass);
            conBBDD=DriverManager.getConnection(dbUrl, "postgres","postgres");
            //conBBDD=DriverManager.getConnection(dbUrl, props);
        } catch(Exception e) {
            return null;
        }

        return conBBDD;
    }



protected void insertaRegistros() {
        Connection conn = getConnection();
        Statement st=null;
        PreparedStatement ps=null;
        try {
            st = conn.createStatement();
            st.executeUpdate("delete from usuarios");
        } catch (SQLException e) {
            e.printStackTrace();
        }

        try {
     ps = conn.prepareStatement("INSERT INTO USUARIOS VALUES         (?,?)");
            for(int i=0;i<110;i++) {
                ps.setString(1,"Nombre "+i);
                ps.setInt(2,i);
                ps.executeUpdate();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            if(st!=null) {
                try {
                    st.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if(ps!=null) {
                try {
                    ps.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

            if(conn!=null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }

    }

/*

public static void main(String[] args) {
            Paginando pag = new Paginando();
            pag.insertaRegistros();
        }*/

    public ArrayList ejecutaQueryPaginada(String query, int numPagina,
                        int numRegPagina) {
    ArrayList alResultado = new ArrayList();
    Connection conBBDD = null;
    Statement st = null;
    ResultSet rs = null;
    try {
        conBBDD=getConnection();
        st = conBBDD.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
        st.setFetchSize(numRegPagina);

        rs = st.executeQuery(query);

        int fila = numRegPagina * (numPagina - 1) + 1;
        int cont = 1;

        ResultSetMetaData md = rs.getMetaData();
        int numeroColumnas = md.getColumnCount();
        ArrayList alRegistro = new ArrayList(numeroColumnas);


        for (int i = 1; i <= numeroColumnas; i++) {
            String nomCol = md.getColumnName(i);
            alRegistro.add(nomCol);
        }

        alResultado.add(alRegistro);

        if (rs.absolute(fila) && numRegPagina > 0) {
            do {
                alRegistro = new ArrayList();
                for (int i = 1; i <= numeroColumnas; i++) {
                    alRegistro.add(rs.getString(i));
                }

                alResultado.add(alRegistro);
                cont++;

            }
            while (rs.next() && (cont <= numRegPagina));
        }
        // Se incluye el primer elemento del ArrayList con un objeto Integer
        // con el Numero de Tuplas TOTAL de la query paginada
        // Se mueve el cursor a ultima tupla
        Integer numTuplasTotal = new Integer(0);
        if (rs.last()) { // Existen tuplas y el cursor esta en la ultima,
                            // basta con consultar el numero de esa tupla
            numTuplasTotal = new Integer(rs.getRow());
        }
        alResultado.add(0, numTuplasTotal);
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if(st!=null) {
            try {
                st.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(rs!=null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(conBBDD!=null) {
            try {
                conBBDD.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }

        }
    }

    return (alResultado);

    }

    public ArrayList ejecutaQuery(String query) {
    ArrayList alResultado = new ArrayList();
    Connection conBBDD = null;
    Statement st = null;
    ResultSet rs = null;
    try {
        conBBDD=getConnection();
        st = conBBDD.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
        rs = st.executeQuery(query);
        int cont = 1;

        ResultSetMetaData md = rs.getMetaData();
        int numeroColumnas = md.getColumnCount();
        ArrayList alRegistro = new ArrayList(numeroColumnas);


        for (int i = 1; i <= numeroColumnas; i++) {
            String nomCol = md.getColumnName(i);
            alRegistro.add(nomCol);
        }

        //alResultado.add(alRegistro);

        
            while (rs.next() ) {
                alRegistro = new ArrayList();
                for (int i = 1; i <= numeroColumnas; i++) {
                    alRegistro.add(rs.getString(i));
                }

                alResultado.add(alRegistro);
                cont++;

            }
            
        
        // Se incluye el primer elemento del ArrayList con un objeto Integer
        // con el Numero de Tuplas TOTAL de la query paginada
        // Se mueve el cursor a ultima tupla
       Integer numTuplasTotal = new Integer(0);
        if (rs.last()) { // Existen tuplas y el cursor esta en la ultima,
                            // basta con consultar el numero de esa tupla
            numTuplasTotal = new Integer(rs.getRow());
        }
        alResultado.add(0, numTuplasTotal);
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if(st!=null) {
            try {
                st.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(rs!=null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if(conBBDD!=null) {
            try {
                conBBDD.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }

        }
    }

    return (alResultado);

    }

    public static void main(String[] args) {
        Paginando pag = new Paginando();
        String consulta = "SELECT ehacod, ehadesc, ehaabr, ehacol,ehaact "+
                         "FROM estadohabitacion";
        List lista = pag.ejecutaQuery(consulta);

        Integer numeroRegistros = (Integer)lista.get(0);

        System.out.println("NUMERO DE REGISTROS TOTALES:"+numeroRegistros.toString());

        for(int i=1;i<lista.size();i++) {
            List lista1 = (List) lista.get(i);
            System.out.println(lista1.toString());
            System.out.println(lista1.get(3));
        }

    }
}
